package com.spsoft.core.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.AsyncConfigurer;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.ThreadPoolExecutor;

/**
 *
 * @author zj 2018年7月8日15:30:39
 * @see在接口上加上@Async，如果加在类上则表示该类的所有接口都是异步的,方法上,则代表是方法的
 *
 *
 */


@Configuration
@EnableAsync // 开启对异步任务的支持
@Slf4j
public class ThreadAsyncConfigurer implements AsyncConfigurer {
	@Bean
	public ThreadPoolTaskExecutor getAsyncExecutor() {
		log.info("-----初始化线程池开始------");
		ThreadPoolTaskExecutor threadPool = new ThreadPoolTaskExecutor();
		//  设置核心线程数
		threadPool.setCorePoolSize(10);
		// 设置最大线程数
		threadPool.setMaxPoolSize(400);
		// 线程池所使用的缓冲队列
		threadPool.setQueueCapacity(10);
		// 等待任务在关机时完成--表明等待所有线程执行完
		threadPool.setWaitForTasksToCompleteOnShutdown(true);
		// 等待时间 （默认为0，此时立即停止），并没等待xx秒后强制停止
		threadPool.setAwaitTerminationSeconds(60);
		// 线程名称前缀
		threadPool.setThreadNamePrefix("HW-Async-");
		//调用者运行策略，线程池中没办法运行，那么就由提交任务的这个线程运行（哪儿来的回哪儿儿去~）
		threadPool.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
		// 初始化线程
		threadPool.initialize();
		log.info("-----初始化线程池结束------");
		return threadPool;
	}

	@Override
	public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
		return null;
	}

}
